package com.chenjia.proto.converter;

import com.google.protobuf.Message;

/**
 * 对象转换工具：{@link Message} 《==》 POJO
 */
public interface MessageConverter {

    /**
     * 将 {@link Message} 对象转为 pojo
     */
    <P, M extends Message> P toPojo(final Class<P> pojoClass, final M message);

    /**
     * 将 pojo 对象转为 {@link Message}
     */
    <P, M extends Message> M toMessage(final Class<M> messageClass, final P pojo);

    /**
     * 反射实现
     */
    static MessageConverter reflect() {
        return ReflectConverter.converter();
    }

    /**
     * ReflectAsm 实现
     *
     * @see <a href="https://github.com/EsotericSoftware/reflectasm">EsotericSoftware/reflectasm</a>
     * @deprecated 正在施工。。。
     */
    static MessageConverter reflectAsm() {
        return ReflectAsmConverter.converter();
    }

    /**
     * 基于 {@link java.lang.invoke.MethodHandle} 实现
     *
     * @see <a href="https://jcp.org/en/jsr/detail?id=292">JSR-292</code>
     */
    static MethodHandleConverter methodHandle() {
        return MethodHandleConverter.converter();
    }
}
